package com.tanhua.server.service;

import com.alibaba.fastjson.JSON;
import com.tanhua.autoconfig.template.FaceTemplate;
import com.tanhua.autoconfig.template.OssTemplate;
import com.tanhua.commons.exception.TanHuaException;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.model.db.User;
import com.tanhua.model.db.UserInfo;
import com.tanhua.model.vo.ErrorResult;
import com.tanhua.model.vo.UserInfoVo;
import com.tanhua.server.interceptor.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.joda.time.DateTime;
import org.joda.time.Years;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 用户管理业务处理层
 */
@Service
@Slf4j
public class UserInfoService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @DubboReference
    private UserInfoApi userInfoApi;

    @Autowired
    private FaceTemplate faceTemplate;

    @Autowired
    private OssTemplate ossTemplate;

    /**
     * 首次登录---完善资料
     *
     * @param userInfoVo (性别 昵称 居住城市 年龄)
     */
    public void loginReginfo(UserInfoVo userInfoVo) {
        //1.根据key查询redis是否登录
//        String tokenKey = "TOKEN_"+token;
//        String userStr = stringRedisTemplate.opsForValue().get(tokenKey);
//        if(StringUtils.isEmpty(userStr)){
//            throw new TanHuaException(ErrorResult.error("000005","请先登录"));
//        }
//        User user = JSON.parseObject(userStr, User.class);
//        log.debug("********************打印tokenKey************************");
//        System.out.println(tokenKey);
//        log.debug("********************打印userStr************************");
//        System.out.println(userStr);
        //2.调用服务保存用户信息tb_userInfo表
        UserInfo userInfo = new UserInfo();
        //2.1将userInfovo数据获取设置到userInfo对象中
        //方式一：
        //userInfo.setNickname(userInfoVo.getNickname());
        //方式二：
        System.out.println(userInfo);
        log.debug("********************来到插入info表************************");
        BeanUtils.copyProperties(userInfoVo, userInfo);
        System.out.println("UserHolder.getUserId()" + UserHolder.getUserId());
        userInfo.setId(UserHolder.getUserId());//用户id
        userInfoApi.add(userInfo);
    }


    /**
     * @param token
     * @param headPhoto
     */
    public void loginReginfoHead(String token, MultipartFile headPhoto) {


        try {
            //2调用人脸识别
            boolean flag = faceTemplate.detect(headPhoto.getBytes());
            if (!flag) {
                throw new TanHuaException(ErrorResult.faceError());//业务异常
            }
            //3调用阿里云上传头像
            String filename = headPhoto.getOriginalFilename();//获取原始文件名
            String headUrl = ossTemplate.upload(filename, headPhoto.getInputStream());

            log.debug("*************3调用阿里云上传头像{}************", headUrl);

            //4调用服务更新头像地址 条件：用户id  更新值：头像url

            UserInfo userInfo = new UserInfo();
            userInfo.setId(UserHolder.getUserId());
            userInfo.setAvatar(headUrl);//用户头像地址
            userInfoApi.update(userInfo);

            log.debug("*************更新头像成功了************");
        } catch (IOException e) {
            log.debug("*************系统异常************" + e.getMessage());
            throw new TanHuaException("上传头像失败");
        }
    }

    /**
     * 读取用户信息
     */
    public UserInfoVo findUserInfo(Long userID) {
        Long currentUserId = UserHolder.getUserId();//当前用户id
        if(userID != null){
            currentUserId = userID;
        }
        //这里少了一个逻辑   判断这个userID是否为空 如果为空 用userId查询 明白不 知道了
        //2用户资料读取 调用服务获取用户详情
        UserInfo userInfo = userInfoApi.findUserInfo(currentUserId);
        //2.1将UserInfo转为UserInfoVo
        UserInfoVo userInfoVo = new UserInfoVo();
        //BeanUtils.copyProperties(userInfo,userInfoVo);
        BeanUtils.copyProperties(userInfo,userInfoVo);

        if(StringUtils.isNotEmpty(userInfo.getBirthday())){
            //如果没有处理的话 前端有可能无法正常显示
            // 因为 Vo年龄是String info里面的是integer
            userInfoVo.setAge(getAge(userInfo.getBirthday())+"");
        }
        return userInfoVo;
        }


    /**
     * 通过年-月-日获取年龄
     * @param yearMonthDay
     * @return
     */
    private int getAge(String yearMonthDay){
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date birthDay = sdf.parse(yearMonthDay);
            Years years = Years.yearsBetween(new DateTime(birthDay), DateTime.now());
            return years.getYears();
        } catch (ParseException e) {
            log.error("获取用户年龄失败!", e);
            return 0;
        }
    }
}


